home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / GFA basic training.adf / SpriteEditor / SPRITEEDITOR.LST < prev   
File List  |  1989-06-01  |  24KB  |  796 lines

  1. ~FRE(0) ! Dummy zur Garbage Collection
  2. ' Spriteeditor V1.8 vom 20.02.89 von Thomas Knab
  3. ' für das Buch-Kapitel SpriteED und Programmoptimierung des Buches
  4. ' "GFA-Basic V3.0 Programmierung auf AMIGA"
  5. ' Incl. Copy, Spiegel, Auf- Abwärts-Ausschnitten, Rechts-Links-Rollen, 4 Farben,
  6. ' und 26-Bilder-Animation.  Spritegrösse: 16x32 Pixel
  7. ' Bit-Scan Routinen optimiert von Frank Ostrowski 15.02.89
  8. '        Das Kopf- und Hauptprogramm:
  9. @initdim
  10. @bildauf
  11. @editor_maske
  12. '               Initialisierung Ende und Hauptschleife:
  13. REPEAT
  14.   @haupt_verzweigung
  15. UNTIL exit|=1
  16. '               Ende des Programms und Speicherfreigabe:
  17. @bildzu
  18. END
  19. '               Routinen:
  20. '               Initialisierung von Arrays, Screen/Window auf- bzw.
  21. '               zumachen und Editor-Maske malen
  22. > PROCEDURE initdim
  23.   ' Komplette Sprite Animation - 26 Slots
  24.   DIM ani_spr$(25)
  25.   ' Je eine Spritezeile als String und als Langwortvariable
  26.   DIM edit_spr$(31)
  27.   DIM spr_zeile%(31)
  28.   ' Blitter-Farbblöcke für GET und PUT:
  29.   DIM a$(3),aa%(2)
  30.   ' 3 User Farben
  31.   DIM color&(2)
  32.   '
  33.   ' Alle Spritefelder mit Null füllen (sonst "SPRITEFEHLER")
  34.   FOR i|=0 TO 25
  35.     ani_spr$(i|)=STRING$(128,0)
  36.   NEXT i|
  37.   copybuffer$=STRING$(128,0)
  38. RETURN
  39. > PROCEDURE bildauf
  40.   OPENS 1,0,0,320,256,3,&H4000    ! 8-Farben-Screen
  41.   SETWPEN 1,0                     ! Titel als Normalschrift (nicht Revers!)
  42.   OPENW #1,0,0,320,256,0,&H1800,1 ! Fullwindow mit Activate
  43.   SETCOLOR 0,&H777                ! Anfangsfarben werden gesetzt
  44.   SETCOLOR 1,&H111
  45.   SETCOLOR 2,&H666
  46.   SETCOLOR 3,&H66
  47.   SETCOLOR 4,&H6
  48.   ' Slider & Malfarbe setzen
  49.   SETCOLOR 5,&HF00
  50.   SETCOLOR 6,&HF0
  51.   SETCOLOR 7,&HF
  52.   TITLEW #1,"SpriteED:GFA-Basic V3.0 Programmierung"
  53.   COLOR 7,0
  54.   ' Hier folgen die Quadrate für die verschiedenen Farben im Malraster
  55.   PBOX 11,11,17,17
  56.   GET 11,11,17,17,a$(3)
  57.   COLOR 6,0
  58.   PBOX 11,11,17,17
  59.   GET 11,11,17,17,a$(1)
  60.   COLOR 5,0
  61.   PBOX 11,11,17,17
  62.   GET 11,11,17,17,a$(2)
  63.   COLOR 0,1
  64.   PBOX 11,11,17,17
  65.   GET 11,11,17,17,a$(0)
  66.   aa%(0)=2
  67.   aa%(1)=1
  68.   aa%(2)=3
  69.   ' Ausschnittsbox begrenzen
  70.   ausy|=29
  71.   ausy1|=47
  72.   COLOR 1,0                       ! Malfarbe für Bildmaske setzen
  73. RETURN
  74. > PROCEDURE bildzu
  75.   SPRITE #2
  76.   SPRITE #3
  77.   SPRITE #4
  78.   SPRITE #6
  79.   CLOSEW #1
  80.   CLOSES 1
  81. RETURN
  82. > PROCEDURE editor_maske
  83.   ' Das Malraster wird erstellt mit 16 Zeilen, 16 Spalten
  84.   FOR i|=0 TO 16
  85.     LINE 10,10+i|*8,138,10+i|*8
  86.     LINE 10+i|*8,10,10+i|*8,138
  87.   NEXT i|
  88.   ' Das Transparent-BOB
  89.   GET 11,11,11+16*7,16,aaa$
  90.   ' Spritebox zur Darstellung
  91.   TEXT 193,22,"Sprite:"
  92.   BOX 206,27,230,65
  93.   ' Up-Down Scrollbox
  94.   BOX 208,29,228,47
  95.   TEXT 233,35,"Ausschnitts"
  96.   TEXT 233,44,"Startzeile:"
  97.   BOX 255,47,287,67
  98.   ' Aktives Animations-Sprite & Darstellungsposition
  99.   TEXT 143,35,"Animate"
  100.   TEXT 143,43,"Slot Nr"
  101.   BOX 155,48,182,67
  102.   ' Rollboxen rechts und links
  103.   TEXT 179,80,"L-Rollen-R"
  104.   BOX 177,72,187,82
  105.   BOX 249,72,260,82
  106.   ' Aktive Slot-Nummer für Animation (Wahl)
  107.   ' Dreieck für plus
  108.   LINE 175,128,192,118
  109.   DRAW  TO 192,137
  110.   DRAW  TO 175,128
  111.   ' Texte für aktiven Slot
  112.   BOX 202,118,231,137
  113.   TEXT 193,114," Slot "
  114.   TEXT 183,130,"+"
  115.   TEXT 210,130,slot|
  116.   TEXT 243,130,"-"
  117.   ' Dreieck für minus
  118.   LINE 257,128,240,118
  119.   DRAW  TO 240,137
  120.   DRAW  TO 257,128
  121.   ' Die Farb-Sliderboxen
  122.   BOX 0,148,157,219
  123.   TEXT 15,146,"Farbeinstellung"
  124.   FOR i|=0 TO 2
  125.     ' 3 Slider Boxen: Rot,Grün,Blau
  126.     ' als Grundfarben
  127.     BOX 8,150+i|*20,138,166+i|*20
  128.   NEXT i|
  129.   TEXT 144,161,"R"
  130.   TEXT 144,181,"G"
  131.   TEXT 144,201,"B"
  132.   ' Aktuelle Farbwahl-Boxen
  133.   TEXT 5,215,"Farben:"
  134.   BOX 63,208,73,217
  135.   ' Auswahlmenü
  136.   FOR i|=0 TO 1
  137.     FOR j|=0 TO 2
  138.       BOX 160+i|*75,145+j|*15,235+i|*80,160+j|*15
  139.     NEXT j|
  140.   NEXT i|
  141.   TEXT 177,156,"CLEAR"
  142.   TEXT 257,156,"COPY"
  143.   TEXT 181,171,"LOAD"
  144.   TEXT 257,171,"SAVE"
  145.   TEXT 170,186,"ANIMATE"
  146.   TEXT 245,186,"SPIEGEL"
  147.   ' EXIT Box
  148.   BOX 211,194,260,208
  149.   TEXT 220,204,"EXIT"
  150.   ' USER-Nachrichten-Box
  151.   BOX 0,236,310,255
  152.   ' Slider-Sprites setzen (Schieber)
  153.   sl_spr$=STRING$(56,&X11110000)
  154.   SPRITE #2,sl_spr$
  155.   SPRITE #3,sl_spr$
  156.   SPRITE #4,sl_spr$
  157.   SETCOLOR 23,&HBBB
  158.   SETCOLOR 27,&HBBB
  159.   color&(0)=&HF00
  160.   color&(1)=&HF0
  161.   color&(2)=&HF
  162.   SPRITE #6,ani_spr$(0)
  163.   SPRITE #6,210,31
  164.   rot_pos|=8
  165.   grÜn_pos|=8
  166.   blau_pos|=8
  167.   ' Farbauswahl-Boxen setzen (Schwarz)
  168.   BOUNDARY 0
  169.   FOR i|=0 TO 2
  170.     COLOR (5+i|),0
  171.     PBOX 80+i|*17,209,88+i|*17,216
  172.   NEXT i|
  173.   COLOR 1,0
  174.   CLR aktive|     ! Anfangswert für Selektion setzen
  175.   @zeig_farbboxwahl(aktive|)
  176.   @slidersetzen
  177. RETURN
  178. '               Hauptverzweigung abhängig von Mausposition
  179. > PROCEDURE haupt_verzweigung
  180.   IF MOUSEK                     ! Überhaupt eine Maustaste gedrückt ?
  181.     xm%=MOUSEX                  ! x-Position
  182.     ym%=MOUSEY                  ! y-Position
  183.     SELECT ym%                  ! nach y-Auswählen (1.Ast)
  184.     CASE 10 TO 139
  185.       ' Diese 4 Proceduren haben direkte Aufgaben:
  186.       SELECT xm%                ! nach x-Auswählen (1.Ast)
  187.       CASE 11 TO 137
  188.         IF ym%<138
  189.           @edit_raster          ! Direkt verzweigen
  190.         ENDIF
  191.       CASE 176 TO 191
  192.         IF ym%>72 AND ym%<82
  193.           @roll_l               ! Ebenfalls direkt verzweigen
  194.         ELSE IF ym%>118
  195.           @slot_inc             ! Direkt verzweigen
  196.         ENDIF
  197.       CASE 196 TO 237
  198.         IF ym%>25 AND ym%<68
  199.           @auss_rauf_runter     ! Nach Ausschnitt verzweigen
  200.         ELSE IF ym%>118
  201.           @wahl_slot_setzen     ! Slot-Nummer direkt abfragen
  202.         ENDIF
  203.       CASE 241 TO 260
  204.         IF ym%>72 AND ym%<82
  205.           @roll_r               ! Direkt verzweigen
  206.         ELSE IF ym%>118
  207.           @slot_dec             ! Direkt verzweigen
  208.         ENDIF
  209.       ENDSELECT
  210.     CASE 150 TO 220             ! Nächste x-orientierte Auswahl (Bildschirmhälfte)
  211.       ' Diese Prozedur wird ebenfalls direkt angesprungen:
  212.       SELECT xm%
  213.       CASE 6 TO 159
  214.         @farb_ed
  215.         ' Diese zwei Proceduren verzweigen weiter:
  216.       CASE 161 TO 234
  217.         @menu_links
  218.       CASE 236 TO 319
  219.         @menu_rechts
  220.       ENDSELECT
  221.     ENDSELECT
  222.     '  EXIT-BOX gedrückt ? => Sicherheitsabfrage
  223.     IF xm%>211 AND xm%<261 AND ym%>194 AND ym%<208
  224.       SPRITE #6,319,255
  225.       ALERT 0,"Sprite ED Verlassen ?",1,"JA,RAUS|ZURUECK",exit|
  226.       SPRITE #6,210,31
  227.     ENDIF
  228.   ENDIF
  229. RETURN
  230. '               Weiterverzweigende Proceduren
  231. > PROCEDURE menu_links
  232.   SELECT ym%    ! Ebenfalls hier die schnelle SELECT-Abfrage
  233.   CASE 145 TO 160
  234.     ' Clear ausgewählt und anspringen
  235.     @clear_sprite
  236.   CASE 160 TO 175
  237.     ' Load gewählt und ebenfalls verzweigen
  238.     dk!=TRUE!                   ! Flag, ob laden oder saven
  239.     @disk(dk!)
  240.   CASE 175 TO 190
  241.     ' Animate Selected und dorthin verzweigen
  242.     @animation
  243.   ENDSELECT
  244. RETURN
  245. > PROCEDURE menu_rechts
  246.   SELECT ym%
  247.   CASE 145 TO 160
  248.     ' Copy Sprite ausgewählt
  249.     @sprite_copy
  250.   CASE 160 TO 175
  251.     ' Speichern Sprites gewählt
  252.     dk!=FALSE!
  253.     @disk(dk!)
  254.   CASE 175 TO 190
  255.     ' Spiegeln Sprite
  256.     @mirror
  257.   ENDSELECT
  258. RETURN
  259. '               Eigentliche Hauptroutinen
  260. '               Direkte Proceduren
  261. > PROCEDURE edit_raster
  262.   ' Zeile ermitteln Mausposition-10 = Anfang des Rasters
  263.   ' Division durch 8 (Raster-Abstand) ist gleich dem 'Bit-Shift-Rechts' 3 mal (2 hoch 3 = 8)
  264.   ypos|=SHR|(ym%-10,3)
  265.   ' Spalte ermitteln (genauso wie oben)
  266.   xpos|=SHR|(xm%-10,3)
  267.   '
  268.   ' Aktuellen Colorblock im Raster setzen
  269.   @block_setzen(aktive|,ypos|,xpos|)
  270.   '
  271.   ' Werte dem Sprite-Slot übergeben abhängig von aktiver Farbe
  272.   Übergabe%=spr_zeile%(ypos|+z_start|)
  273.   SELECT aktive|
  274.   CASE 0
  275.     Übergabe%=BSET(Übergabe%,xpos|+16)
  276.     Übergabe%=BCLR(Übergabe%,xpos|)
  277.   CASE 1
  278.     Übergabe%=BCLR(Übergabe%,xpos|+16)
  279.     Übergabe%=BSET(Übergabe%,xpos|)
  280.   CASE 2
  281.     Übergabe%=BSET(Übergabe%,xpos|+16)
  282.     Übergabe%=BSET(Übergabe%,xpos|)
  283.   ENDSELECT
  284.   ' Transparent ? dann alle Bits dieser Position löschen!
  285.   IF lÖsch!
  286.     Übergabe%=BCLR(Übergabe%,xpos|)
  287.     Übergabe%=BCLR(Übergabe%,xpos|+16)
  288.   ENDIF
  289.   spr_zeile%(ypos|+z_start|)=Übergabe%
  290.   @spiegeln(ypos|+z_start|)
  291.   ' Jetzt sind die neuen Daten bereit zur Übergabe
  292.   ' Es werden nur die veränderten Daten eingefügt:
  293.   MID$(ani_spr$(slot|),(ypos|+z_start|)*4+1)=MKL$(spiegel%)
  294.   ' Spritefarbe setzen (nur Sprite #6):
  295.   SETCOLOR 29,color&(0)
  296.   SETCOLOR 30,color&(1)
  297.   SETCOLOR 31,color&(2)
  298.   SPRITE #6,ani_spr$(slot|)
  299.   SPRITE #6,210,31
  300. RETURN
  301. > PROCEDURE farb_ed
  302.   DO WHILE MOUSEK=1             ! In dieser Routine bleiben, solange der Mausknopf gedrückt ist
  303.     my%=MOUSEY
  304.     mx%=MOUSEX
  305.     ' Farbeinstellung mit 3 interaktiven Slidern
  306.     SELECT my%
  307.     CASE 150 TO 166                     ! Im Slider ROT ?
  308.       IF mx%>rot_pos|+8 AND mx%<=135    ! Vor der alten Position
  309.         ADD rot_pos|,8                  ! Der oben erwähnte Achter-Schritt
  310.         ADD color&(aktive|),&H100       ! Farbwert erhöhen
  311.         SPRITE #2,MIN(rot_pos|,128),152 ! Neue Sliderposition setzen
  312.       ELSE IF mx%<rot_pos|-8 AND mx%=>3 ! hinter der alten Position
  313.         SUB rot_pos|,8
  314.         SUB color&(aktive|),&H100       ! Farbwert erniedrigen
  315.         SPRITE #2,rot_pos|,152          ! Neue Sliderposition
  316.       ENDIF
  317.     CASE 170 TO 186                     ! Wie oben für GRÜN
  318.       IF mx%>grÜn_pos|+8 AND mx%<=135
  319.         ADD grÜn_pos|,8
  320.         ADD color&(aktive|),&H10
  321.         SPRITE #3,MIN(grÜn_pos|,128),172
  322.       ELSE IF mx%<grÜn_pos|-8 AND mx%=>3
  323.         SUB grÜn_pos|,8
  324.         SUB color&(aktive|),&H10
  325.         SPRITE #3,grÜn_pos|,172
  326.       ENDIF
  327.     CASE 190 TO 206                     ! Und ebenfalls für Blau
  328.       IF mx%>blau_pos|+8 AND mx%<=135
  329.         ADD blau_pos|,8
  330.         INC color&(aktive|)
  331.         SPRITE #4,MIN(blau_pos|,128),192
  332.       ELSE IF mx%<blau_pos|-8 AND mx%=>3
  333.         SUB blau_pos|,8
  334.         DEC color&(aktive|)
  335.         SPRITE #4,blau_pos|,192
  336.       ENDIF
  337.     CASE 208 TO 220                     ! Im Bereich der Farbboxwahl ?
  338.       SELECT mx%
  339.         '   Farbboxwahl - Radio-Buttons
  340.       CASE 64 TO 72                     ! Hintergrundfarbe
  341.         DEFLINE 0                       ! Alten Rahmen löschen
  342.         @zeig_farbboxwahl(aktive|)
  343.         lÖsch!=TRUE!                   ! Löschflag setzen
  344.       CASE 81 TO 87                     ! Farbe 1
  345.         DEFLINE 0
  346.         @zeig_farbboxwahl(aktive|)
  347.         aktive|=0                       ! Farbnummer setzen für alle Routinen
  348.         DEFLINE 1
  349.         @zeig_farbboxwahl(aktive|)
  350.         @slidersetzen
  351.         lÖsch!=FALSE!                  ! Löschflag sicherheitshalber löschen
  352.       CASE 98 TO 104                    ! Farbe 2
  353.         DEFLINE 0
  354.         @zeig_farbboxwahl(aktive|)
  355.         aktive|=1                       ! Farbnummer setzen
  356.         DEFLINE 1
  357.         @zeig_farbboxwahl(aktive|)
  358.         @slidersetzen
  359.         lÖsch!=FALSE!
  360.       CASE 115 TO 121                   ! Und Farbe 3
  361.         DEFLINE 0
  362.         @zeig_farbboxwahl(aktive|)
  363.         aktive|=2
  364.         DEFLINE 1
  365.         @zeig_farbboxwahl(aktive|)
  366.         @slidersetzen
  367.         lÖsch!=FALSE!
  368.       ENDSELECT
  369.     ENDSELECT
  370.     ' Nun die aktuelle Farbe in Boxwahl & Sprite aktualisieren
  371.     @aktuellefarbe
  372.     ' Keine Farbe setzen oder die Maustaste wurde losgelassen = Exit
  373.   LOOP UNTIL lÖsch!
  374. RETURN
  375. > PROCEDURE slot_inc
  376.   IF slot|<=24                          ! Letzter Slot erreicht ?
  377.     farbex|=aktive|                     ! Aktive Farbe retten
  378.     INC slot|                           ! Slot hochzählen
  379.     TEXT 210,130,"  "                   ! Alte Nummer im Kasten löschen
  380.     TEXT 210,130,slot|                  ! Neue dort schreiben
  381.     SPRITE #6,ani_spr$(slot|)           ! Sprite darstellen
  382.     @sprite_in_raster                   ! und ins Malraster übertragen
  383.     aktive|=farbex|                     ! Gerettete Farbe zurückschreiben
  384.   ENDIF
  385. RETURN
  386. > PROCEDURE slot_dec
  387.   IF slot|                              ! Nullter Slot erreicht ?
  388.     farbex|=aktive|
  389.     DEC slot|                           ! Slot runterzählen
  390.     TEXT 210,130,"  "
  391.     TEXT 210,130,slot|
  392.     SPRITE #6,ani_spr$(slot|)
  393.     @sprite_in_raster
  394.     aktive|=farbex|
  395.   ENDIF
  396. RETURN
  397. > PROCEDURE wahl_slot_setzen
  398.   TEXT 210,130,"  "
  399.   @nachricht_lÖschen
  400.   TEXT 10,248,"Slot # bitte ZWEISTELLIG eingeben "
  401.   REPEAT
  402.     @slot_taste_lesen
  403.     IF slot$>"2"                        ! Test auf Wertgrenze
  404.       @nachricht_lÖschen
  405.       TEXT 10,248,"Slot # nicht grösser als 2x !    "
  406.     ELSE
  407.       TEXT 210,130,slot$
  408.     ENDIF
  409.   UNTIL slot$>="0" AND slot$<"3"
  410.   slot1$=slot$                          ! und zwischenspeichern
  411.   REPEAT
  412.     @slot_taste_lesen
  413.     slot$=slot1$+slot$                  ! Einerstelle dazuaddieren
  414.     IF slot$>"25"
  415.       @nachricht_lÖschen
  416.       TEXT 10,248,"Slot # nicht grösser als 25 !    "
  417.     ELSE
  418.       TEXT 210,130,slot$                ! Angewählten Slot ausgeben
  419.     ENDIF
  420.   UNTIL slot$>="00" AND slot$<"26"
  421.   slot|=VAL(slot$)                      ! Zum aktuellen Slot machen
  422.   SPRITE #6,ani_spr$(slot|)             ! Im Sprite
  423.   @sprite_in_raster                     ! und im Malraster darstellen
  424. RETURN
  425. > PROCEDURE roll_r
  426.   LOCAL zeile|
  427.   ' Sprite zum Bearbeiten holen...
  428.   BMOVE V:ani_spr$(slot|),V:spr_zeile%(0),128
  429.   ' ROR die einzelnen Worte (wegen Farben) aufgeteilt in obere + untere 16 Bits
  430.   ' CARD wegen der Besonderheit des ROR&
  431.   ' (Kopiert Bit 15 in Bits 16 bis 31!)
  432.   FOR zeile|=0 TO 31
  433.     ' Oberes Wort + Unteres Wort
  434.     spr_zeile%(zeile|)=SWAP(CARD(ROR&(SWAP(spr_zeile%(zeile|)),1)))+CARD(ROR&(spr_zeile%(zeile|),1))
  435.   NEXT zeile|
  436.   ' Und in den aktuellen Sprite kopieren:
  437.   BMOVE V:spr_zeile%(0),V:ani_spr$(slot|),128
  438.   ' Darstellen und ins Raster:
  439.   SPRITE #6,ani_spr$(slot|)
  440.   @sprite_in_raster
  441. RETURN
  442. > PROCEDURE roll_l
  443.   LOCAL zeile|
  444.   BMOVE V:ani_spr$(slot|),V:spr_zeile%(0),128
  445.   ' ROL wird genauso behandelt wie ROR (siehe dort...)
  446.   FOR zeile|=0 TO 31
  447.     spr_zeile%(zeile|)=SWAP(CARD(ROL&(SWAP(spr_zeile%(zeile|)),1)))+CARD(ROL&(spr_zeile%(zeile|),1))
  448.   NEXT zeile|
  449.   BMOVE V:spr_zeile%(0),V:ani_spr$(slot|),128
  450.   SPRITE #6,ani_spr$(slot|)
  451.   @sprite_in_raster
  452. RETURN
  453. '               Unter-Prozeduren aus menu_rechts und menu_links
  454. > PROCEDURE disk(dk!)
  455.   ' Da die Sprites eventuell im FILESELECT-Requester stehen können werden sie unten rechts versteckt:
  456.   SPRITE #2,319,256
  457.   SPRITE #3,319,256
  458.   SPRITE #4,319,256
  459.   SPRITE #6,319,256
  460.   ' Jetzt wird das dk!-Flag getestet, ob geladen oder gespeichert werden soll:
  461.   IF dk!
  462.     ' Die DO-LOOP Schleife ist nur für das EXIT IF TRUE, damit bei
  463.     ' FILESELECT-Abbruch sowie bei Irrtum-Wahl abgebrochen werden kann
  464.     DO
  465.       FILESELECT "Sprite Laden (.SPR)","Laden",":",datei$
  466.       IF RIGHT$(datei$,4)<>".SPR" OR datei$="" OR RIGHT$(datei$)=":"
  467.         @nachricht_lÖschen
  468.         TEXT 10,248,"KEINE SPRITE DATEI!"
  469.         ' Raus bei Irrtum
  470.         EXIT IF TRUE
  471.       ENDIF
  472.       '
  473.       ' Farbtabelle laden
  474.       OPEN "I",#1,datei$+"C"
  475.       FOR aktive|=0 TO 2
  476.         INPUT #1,color&(aktive|)
  477.         @aktuellefarbe
  478.       NEXT aktive|
  479.       CLOSE #1
  480.       CLR aktive|
  481.       ' Radio-Button setzen
  482.       @zeig_farbboxwahl(aktive|)
  483.       ' Farb-Slider für aktive Farbe richtig setzen (versteckte Sprites
  484.       ' wieder auf die richtige Position bringen
  485.       @slidersetzen     ! Slider auf Farbe0 setzen
  486.       '
  487.       ' Sprite-Daten laden
  488.       OPEN "I",#1,datei$
  489.       FOR i|=0 TO PRED(DIM?(ani_spr$()))
  490.         ani_spr$(i|)=INPUT$(128,#1)
  491.       NEXT i|
  492.       CLOSE #1
  493.       '
  494.       ' Den nullten Sprite aktivieren und ins Spritefenster setzen
  495.       ' sowie die neue Slot-Nummer bekanntgeben
  496.       CLR slot|
  497.       TEXT 210,130,"  "
  498.       TEXT 210,130,slot|
  499.       SPRITE #6,ani_spr$(slot|)
  500.       VSYNC
  501.       ' Versteckte Sprites wieder richtig positionieren:
  502.       SPRITE #6,210,31
  503.       ' Und im Malraster den aktuellen Ausschnitt darstellen
  504.       @sprite_in_raster
  505.       ' Nachricht schicken, daß alles ok und fertig ist
  506.       @nachricht_lÖschen
  507.       TEXT 10,248,"Geladen wurde "+datei$
  508.     LOOP UNTIL TRUE                     ! Auf jeden Fall raus
  509.   ELSE                                  ! Speicher-Flag?
  510.     DO
  511.       FILESELECT "Sprite Speichern","Speichern",":",datei$
  512.       IF datei$="" OR RIGHT$(datei$)=":"
  513.         @nachricht_lÖschen
  514.         TEXT 10,248,"SPRITES NICHT GESPEICHERT !"
  515.         EXIT IF TRUE
  516.       ELSE IF RIGHT$(datei$,4)<>".SPR"
  517.         datei$=datei$+".SPR"
  518.       ENDIF
  519.       '
  520.       ' Farben Speichern mit Extension 'SPRC'
  521.       OPEN "O",#1,datei$+"C"
  522.       FOR i|=0 TO 2
  523.         PRINT #1,color&(i|)
  524.       NEXT i|
  525.       CLOSE #1
  526.       '
  527.       ' Sprite-Sequenz als gesamtes Speichern
  528.       OPEN "O",#1,datei$
  529.       FOR i|=0 TO PRED(DIM?(ani_spr$()))
  530.         PRINT #1,ani_spr$(i|);
  531.       NEXT i|
  532.       CLOSE #1
  533.       '
  534.       ' OK Nachricht ausgeben:
  535.       @nachricht_lÖschen
  536.       TEXT 10,248,"Gespeichert in "+datei$
  537.       ' Jetzt werden alle versteckten Sprites wieder
  538.       ' auf die richtige Position gesetzt:
  539.       @slidersetzen
  540.       SPRITE #6,210,31
  541.       ' Auf jeden Fall rauskommen...
  542.     LOOP UNTIL TRUE
  543.   ENDIF
  544. RETURN
  545. > PROCEDURE sprite_copy
  546.   @nachricht_lÖschen
  547.   ' Soll ein SPrite aus oder in den Buffer kopiert werden ?
  548.   TEXT 10,248,"COPY SPRITE (IN) ODER (AUS) BUFFER"
  549.   ' Um eine Reaktion erwarten zu können, eine Pause:
  550.   PAUSE 8
  551.   ' und warten auf Mausklick:
  552.   REPEAT
  553.   UNTIL MOUSEK
  554.   ' Dann verzweige erst auf, in oder aus:
  555.   IF MOUSEX>110 AND MOUSEX<135
  556.     @nachricht_lÖschen
  557.     TEXT 10,248,"SPRITE #   IM BUFFER !            "
  558.     ' OK, dann kopiere aktuellen Sprite in Buffer:
  559.     copybuffer$=ani_spr$(slot|)
  560.     flag!=TRUE!
  561.     ' Und teile es dem Benutzer mit:
  562.     TEXT 78,248,slot|
  563.   ELSE IF MOUSEX>190 AND MOUSEX<223
  564.     @nachricht_lÖschen
  565.     ' Kopiere Buffer in den aktuellen Sprite
  566.     ani_spr$(slot|)=copybuffer$
  567.     TEXT 10,248,"BUFFER NACH SPRITE #   KOPIERT    "
  568.     SPRITE #6,ani_spr$(slot|)
  569.     flag!=TRUE!
  570.     TEXT 175,248,slot|
  571.     ' Und stelle es im Malraster dar:
  572.     @sprite_in_raster
  573.     ' Abbruch durch RECHTE Maustaste oder durch falsches Anklicken:
  574.   ELSE IF MOUSEK=2 OR flag!=FALSE!
  575.     @nachricht_lÖschen
  576.     TEXT 10,248,"COPY ABGEBROCHEN!"
  577.   ENDIF
  578.   ' flag! RESET:
  579.   flag!=FALSE!
  580. RETURN
  581. > PROCEDURE clear_sprite
  582.   ' 15 Zeilen
  583.   FOR j|=0 TO 15
  584.     ' und 15 Spalten des Malrasters
  585.     FOR i|=0 TO 15
  586.       ' werden gelöscht:
  587.       PUT i|*8+11,j|*8+11,a$(0)
  588.     NEXT i|
  589.     ' Jetzt wird die Spritezeile gelöscht und auf Null gesetzt
  590.     spr_zeile%(j|)=0
  591.     ' Beide Wörter, darum:
  592.     spr_zeile%(j|+16)=0
  593.     ' Und die Sprites:
  594.     edit_spr$(j|)=MKL$(0)
  595.     edit_spr$(j|+16)=MKL$(0)
  596.   NEXT j|
  597.   ' Aktuellen Slot mit Nullen überschreiben und löschen:
  598.   ani_spr$(slot|)=STRING$(128,0)
  599.   ' Dargestellten Sprite aktualisieren: als gelöschten (transparenten)
  600.   ' Sprite darstellen
  601.   SPRITE #6,ani_spr$(slot|)
  602. RETURN
  603. > PROCEDURE animation
  604.   ' Hier wird die Obergrenze festgelegt:
  605.   FOR i|=0 TO slot|
  606.     ' Pause, damit der Benutzer den Wechsel verfolgen kann
  607.     PAUSE 1
  608.     TEXT 161,60,"  "
  609.     ' Momentane Sequenznummer schreiben:
  610.     TEXT 161,60,i|
  611.     VSYNC
  612.     ' Und darstellen:
  613.     SPRITE #6,ani_spr$(i|)
  614.   NEXT i|
  615.   ' Nach Animate aktuellen Slot wieder bereitstellen
  616.   PAUSE 10
  617.   TEXT 161,60,"  "
  618.   SPRITE #6,ani_spr$(slot|)
  619. RETURN
  620. > PROCEDURE mirror
  621.   ' Aktiven Sprite-Slot in das Zeilen-Langwort-Array kopieren
  622.   BMOVE V:ani_spr$(slot|),V:spr_zeile%(0),128
  623.   ' 32 Zeilen Spiegeln ...
  624.   FOR ypos|=0 TO 31
  625.     CLR spiegel%
  626.     ' Der Spiegelroutine übergeben..
  627.     @spiegeln(ypos|)
  628.     spr_zeile%(ypos|)=spiegel%
  629.     ' ... und in Sprite-Slot übergeben
  630.   NEXT ypos|
  631.   BMOVE V:spr_zeile%(0),V:ani_spr$(slot|),128
  632.   ' in den Sprite-Slot darstellen
  633.   SPRITE #6,ani_spr$(slot|)
  634.   ' den aktuellen Sprite-Ausschnitt in der Malbox zeichnen
  635.   @sprite_in_raster
  636. RETURN
  637. '               Die Hilfs- und Unterroutinen
  638. > PROCEDURE spiegeln(ypos|)
  639.   LOCAL i|,a%
  640.   ' Spiegel-Zwischen-Variable löschen:
  641.   CLR spiegel%
  642.   ' Aktuelle Spritezeile einer Hilfsvariablen übergeben
  643.   a%=spr_zeile%(ypos|)
  644.   ' Wenn Bit gesetzt ist, setze es in
  645.   FOR i|=0 TO 15
  646.     IF BTST(a%,i|)
  647.       ' .. der Langwortvariablen spiegelverkehrt
  648.       spiegel%=BSET(spiegel%,SUB(15,i|))
  649.     ENDIF
  650.   NEXT i|
  651.   FOR i|=16 TO 31
  652.     IF BTST(a%,i|)
  653.       ' und diese Operation ebenfalls für das obere Datenwort
  654.       spiegel%=BSET(spiegel%,SUB(47,i|))
  655.     ENDIF
  656.   NEXT i|
  657.   ' Und spiegel% enthält die korrekten Spritezeilen-Daten,
  658.   ' um damit weiterzuarbeiten
  659. RETURN
  660. > PROCEDURE block_setzen(aktive|,ypos|,xpos|)
  661.   ' Farbe oder löschen ?
  662.   IF lÖsch!
  663.     ' Wenn gelöscht werden soll, setze durchsichtigen Block
  664.     PUT 11+xpos|*8,11+ypos|*8,a$(0)
  665.   ELSE
  666.     ' Ansonsten die aktuelle Farbe
  667.     PUT 11+xpos|*8,11+ypos|*8,a$(aa%(aktive|))
  668.   ENDIF
  669. RETURN
  670. > PROCEDURE sprite_in_raster
  671.   ' Vom Sprite-Slot$ nach 4Byte-Wert rüberschieben
  672.   ' Sprite steht für die Bildwiedergabe jetzt in den Spritezeilen verkehrt
  673.   BMOVE V:ani_spr$(slot|),V:spr_zeile%(0),128
  674.   '
  675.   ' Positionen der Bits und deren Farbwerte ermitteln
  676.   ' Auch "scannen" genannt..
  677.   ' 16 Zeilen bei 16 Spalten sind 256 Positionen
  678.   ii%=11        ! Rasterstartzeile
  679.   ' Nur den aktuellen Spriteausschnitt darstellen:
  680.   FOR i|=z_start| TO 15+z_start|
  681.     jj%=11      ! Rasterstartspalte
  682.     s_zeile%=spr_zeile%(i|)
  683.     ' Für Bildschirm-Darstellung spiegeln
  684.     @spiegeln(i|)
  685.     spr_zeile%(i|)=spiegel%
  686.     ' Ist die zu bearbeitende Zeile leer (d.h. KEIN Bit gesetzt)?
  687.     IF s_zeile%
  688.       ' Oberes Spritewort in zweite Hilfsvariable übernehmen:
  689.       s_tausch%=SWAP(s_zeile%)
  690.       FOR j|=15 DOWNTO 0
  691.         ' Hier wird die aktuelle Farbe errechnet und gePUTet..
  692.         PUT jj%,ii%,a$(SUB(-BTST(s_zeile%,j|),2*BTST(s_tausch%,j|)))
  693.         ' Nächste Rasterposition in der Zeile:
  694.         ADD jj%,8
  695.       NEXT j|
  696.     ELSE
  697.       ' Hier wird die Zeile mit der Hintergrundfarbe gefüllt:
  698.       ' also im Sprite KEIN BIT gesetzt (transparent)
  699.       FOR j|=0 TO 15
  700.         PUT jj%+j|*8,ii%,a$(0)
  701.       NEXT j|
  702.     ENDIF
  703.     ADD ii%,8   ! Nächste Rasterzeile
  704.   NEXT i|
  705. RETURN
  706. > PROCEDURE aktuellefarbe
  707.   ' Aktuelle Farbe in angewählte Box setzen ...
  708.   ' SETCOLOR in Farbe 5,6, oder 7...
  709.   SETCOLOR ADD(5,aktive|),color&(aktive|)
  710.   ' Aktive, neu gesetzte Farbe aktivieren:
  711.   COLOR 5+aktive|,0
  712.   ' Und Box mit neuer Farbe malen:
  713.   PBOX 80+aktive|*17,209,88+aktive|*17,216
  714.   ' Farbe für alles andere wieder zurücksetzen
  715.   COLOR 1,0
  716.   ' Neue Farbe ebenfalls dem Sprite mitteilen (SPRITE #6):
  717.   SETCOLOR (29+aktive|),(color&(aktive|))
  718. RETURN
  719. > PROCEDURE slidersetzen
  720.   ' Farbwert ermitteln (X= AND mit max. möglichen Farbwert)
  721.   ' Zum relativen Byte-Wert umrechnen (x1=SHR x,(R:8,G:4,B:0))
  722.   ' dann Position anpassen in achter Schritten:
  723.   ' x2=(x1*8)=(SHL x1,3) plus dem Slideranfang (+8)
  724.   ' Die zusammengerechneten SHIFTungen ergeben für:
  725.   ' Rot:SHR(x2,5); Grün:SHR(x2,1); Blau:SHL(x2,3)
  726.   ' Zusammengefaßt werden diese Programmzeilen daraus:
  727.   rot_pos|=SHR(AND(color&(aktive|),&HF00),5)+8
  728.   grÜn_pos|=SHR(AND(color&(aktive|),&HF0),1)+8
  729.   blau_pos|=SHL(AND(color&(aktive|),&HF),3)+8
  730.   ' Und die errechneten Slider-Positionen setzen
  731.   SPRITE #2,rot_pos|,152
  732.   SPRITE #3,grÜn_pos|,172
  733.   SPRITE #4,blau_pos|,192
  734. RETURN
  735. > PROCEDURE zeig_farbboxwahl(aktive|)
  736.   ' Angewählte Box einrahmen bzw. Rahmen löschen
  737.   BOX 79+aktive|*17,208,89+aktive|*17,217
  738. RETURN
  739. > PROCEDURE slot_taste_lesen
  740.   DO
  741.     slot$=INKEY$
  742.     EXIT IF slot$<>"" AND slot$=>"0" AND slot$<"9"
  743.   LOOP
  744. RETURN
  745. > PROCEDURE nachricht_lÖschen
  746.   COLOR 0,1
  747.   PBOX 2,238,308,253
  748.   COLOR 1,0
  749. RETURN
  750. > PROCEDURE auss_rauf_runter
  751.   ' In dieser Schleife bleiben, bis die Maustaste losgelassen wurde
  752.   DO WHILE MOUSEK=1
  753.     ' Soll der Ausschnitt unter oder über dem alten sein?
  754.     IF ym%>ausy1|
  755.       ausschnitt!=TRUE!
  756.       @ausschnitt_box
  757.       TEXT 265,60,"  "
  758.       TEXT 265,60,z_start|
  759.     ELSE IF ym%<ausy|
  760.       ausschnitt!=FALSE!
  761.       @ausschnitt_box
  762.       TEXT 265,60,"  "
  763.       TEXT 265,60,z_start|
  764.     ENDIF
  765.   LOOP UNTIL MOUSEK<>1
  766.   ' Neuen Ausschnitt dem Malraster übergeben
  767.   @sprite_in_raster
  768. RETURN
  769. > PROCEDURE ausschnitt_box
  770.   ' Alte Ausschnittbox löschen
  771.   DEFLINE 0
  772.   BOX 208,ausy|,228,ausy1|
  773.   ' Über oder unter dem alten Ausschnitt
  774.   IF ausschnitt!
  775.     ' Im Erlaubten Maximal-Wert-Bereich ?
  776.     IF ausy1|<63
  777.       ' OK, dann Zeiger und Boxkoordinaten hochzählen
  778.       INC ausy|
  779.       INC ausy1|
  780.       INC z_start|
  781.     ENDIF
  782.   ELSE
  783.     ' Im erlaubten Minimal-Wert-Bereich ?
  784.     IF ausy|>29
  785.       ' OK, dann Boxkoordinaten runterzählen
  786.       DEC ausy|
  787.       DEC ausy1|
  788.       DEC z_start|
  789.     ENDIF
  790.   ENDIF
  791.   ' Dann neue Ausschnittbox malen
  792.   COLOR 1
  793.   DEFLINE 1
  794.   BOX 208,ausy|,228,ausy1|
  795. RETURN
  796.